package com.ruoyi.common.core.domain.entity;

import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.UUIDGenerator;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Objects;

/**
 * 菜单权限表 sys_menu
 *
 * @author ruoyi
 */
@Entity
@Table(name = "sys_menu")
public interface SysMenu extends BaseEntity {

    /**
     * 菜单ID
     */
    @Id
    @GeneratedValue(generatorType = UUIDGenerator.class)
    String menuId();

    /**
     * 菜单名称
     */
    String menuName();

    /**
     * 显示顺序
     */
    Integer orderNum();

    /**
     * 路由地址
     */
    @Nullable
    String path();

    /**
     * 组件路径
     */
    @Nullable
    String component();

    /**
     * 路由参数
     */
    @Nullable
    String query();

    /**
     * 路由名称，默认和路由地址相同的驼峰格式（注意：因为vue3版本的router会删除名称相同路由，为避免名字的冲突，特殊情况可以自定义）
     */
    String routeName();

    /**
     * 是否为外链（0是 1否）
     */
    @Column(name = "is_frame")
    @Nullable
    String frameStatus();

    /**
     * 是否缓存（0缓存 1不缓存）
     */
    @Column(name = "is_cache")
    @Nullable
    String cacheStatus();

    /**
     * 类型（M目录 C菜单 F按钮）
     */
    String menuType();

    /**
     * 显示状态（0显示 1隐藏）
     */
    @Nullable
    String visible();

    /**
     * 菜单状态（0正常 1停用）
     */
    String status();

    /**
     * 权限字符串
     */
    @Nullable
    String perms();

    /**
     * 菜单图标
     */
    @Nullable
    String icon();

    /**
     * 子菜单
     */
    @OneToMany(mappedBy = "parent")
    List<SysMenu> children();

    @ManyToOne
    @OnDissociate(DissociateAction.DELETE)
    @Nullable
    SysMenu parent();

    @IdView("parent")
    @Nullable
    String parentId();

    @ManyToMany(mappedBy = "menus")
    List<SysRole> roles();

    @IdView("roles")
    List<String> roleIds();

    @Formula(dependencies = {"status"})
    default boolean disabled() {
        return Objects.equals(this.status(), "1");
    }

}
